package com.example.springboot.model;

import java.util.HashMap;
import java.util.Map;

/**
 * API响应模型类
 * 该类用于统一处理系统中所有API的响应格式，包含成功/失败状态、消息和数据
 * 提供了创建成功和失败响应的静态工厂方法，方便控制器层使用
 */
public class ApiResponse {
    /**
     * 响应是否成功的标志
     * true表示成功，false表示失败
     */
    private boolean success;

    /**
     * 响应消息
     * 用于描述操作结果的详细信息
     */
    private String message;

    /**
     * 响应数据
     * 可以是任意类型的对象，用于返回业务数据
     */
    private Object data;

    /**
     * 默认无参构造函数
     */
    public ApiResponse() {
    }

    /**
     * 带状态和消息的构造函数
     * 
     * @param success 是否成功
     * @param message 响应消息
     */
    public ApiResponse(boolean success, String message) {
        this.success = success;
        this.message = message;
    }

    /**
     * 完整参数的构造函数
     * 
     * @param success 是否成功
     * @param message 响应消息
     * @param data    响应数据
     */
    public ApiResponse(boolean success, String message, Object data) {
        this.success = success;
        this.message = message;
        this.data = data;
    }

    /**
     * 创建成功响应
     * 
     * @param message 成功消息
     * @return 响应对象
     */
    public static ApiResponse success(String message) {
        return new ApiResponse(true, message);
    }

    /**
     * 创建成功响应（带数据）
     * 
     * @param message 成功消息
     * @param data    响应数据
     * @return 响应对象
     */
    public static ApiResponse success(String message, Object data) {
        return new ApiResponse(true, message, data);
    }

    /**
     * 创建失败响应
     * 
     * @param message 失败消息
     * @return 响应对象
     */
    public static ApiResponse error(String message) {
        return new ApiResponse(false, message);
    }

    // Getters and Setters 访问器和修改器
    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}